package com.yfp.client.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.binarywang.wxpay.bean.notify.WxPayPartnerNotifyV3Result;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.yfp.client.domain.Client;
import com.yfp.client.domain.ClientBill;
import com.yfp.client.domain.OrderCombo;
import com.yfp.client.domain.OrderGiftGold;
import com.yfp.client.domain.dto.ClientBillReqDTO;
import com.yfp.client.domain.dto.StoredResultsDTO;
import com.yfp.client.domain.vo.ClientBillVO;

import java.util.List;

/**
 *
 * @description 针对表【client_bill(用户余额明细)】的数据库操作Service
 * @createDate 2024-11-22 10:15:05
 */
public interface ClientBillService extends IService<ClientBill> {

    /**
     * 获取用户余额明细列表
     *
     * @param clientBill
     * @return
     */
    List<ClientBillVO> getClientBillList(ClientBillReqDTO clientBill);

    /**
     * 充值支付结算-创建订单
     *
     * @param activityId       活动id
     * @param activityDetailId 活动详情id
     * @return 订单号
     */
    String rechargeSettle(Long activityId, Long activityDetailId);

    /**
     * 充值支付结算-调用微信接口
     *
     * @param orderSn 订单号
     * @return 调用微信接口数据
     */
    WxPayUnifiedOrderV3Result.JsapiResult rechargeSettlePayment(String orderSn);

    /**
     * 订单支付回调通知处理
     *
     * @param wxPayPartnerNotifyV3Result 微信回调通知数据
     * @return
     */
    void orderCreateNotify(WxPayPartnerNotifyV3Result wxPayPartnerNotifyV3Result);

    /**
     * 判断当前用户是否首充
     *
     * @return
     */
    Boolean isFirstStored();

    /**
     * 判断用户是否首充
     *
     * @return
     */
    Boolean isFirstStored(String clientId);

    /**
     * 获取用户余额充值完成的明细列表
     *
     * @return
     */
    List<ClientBill> getClientBillRechargeList();

    /**
     * 余额整单退款订单
     * 恢复充值金额、赠送金
     *
     * @param orderCombo 订单明细
     * @param client
     */
    void balanceRefundOrder(OrderCombo orderCombo, Client client);

    /**
     * 根据客户id获取充值记录
     *
     * @param clientId
     * @return
     */
    List<ClientBill> balanceNotZero(String clientId);

    /**
     * 清空储值记录的余额和赠送金余额
     *
     * @param cbId
     */
    void emptyCurrentBillMoney(Long cbId);

    /**
     * 余额部分退款订单
     * 恢复充值金额、赠送金
     *
     * @param client         订单
     * @param orderGiftGolds
     */
    void balanceRefundOrder(Client client, List<OrderGiftGold> orderGiftGolds);

    /**
     * 余额部分退款订单
     * 插入退款记录
     *
     * @param orderId
     * @param client
     * @param orderGiftGolds
     */
    void balanceRefundInsertOrder(String orderId, Client client, List<OrderGiftGold> orderGiftGolds);

    /**
     * 插入退款记录
     *
     * @param clientBill
     */
    void createRefund(ClientBill clientBill);

    /**
     * 根据订单号获取数据
     *
     * @param orderId
     * @return
     */
    ClientBill getByOrderSn(String orderId);

    void createBalancePay(String orderId, StoredResultsDTO storedResultsDTO, List<ClientBill> clientBills, Client client);

    /**
     * 修改状态
     *
     * @param id
     */
    void updateStatus(Long id, Integer status);
}
